package br.ufrn.cerescaico.sepe.actions;

import br.ufrn.cerescaico.sepe.Sepe;
import br.ufrn.cerescaico.sepe.dao.util.PagerBean;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import org.displaytag.tags.TableTagParameters;
import org.displaytag.util.ParamEncoder;

/**
 * Classe Base da Hierarquia de Actions do Sistema Sepe.<br>
 * Sistema de Gerenciamento e Coordenação de Eventos Acadêmicos.
 * @author Taciano Morais Silva - tacianosilva@gmail.com
 * @version 08/06/2010, 11h38m
 * @since 08/06/2010, 11h38m
 */
public class SepeAction extends ActionSupport {

    /**
     * Resultado para a solicitação de inclusão.
     */
    public static final String SOLICITAR_INCLUSAO = "solicitarInclusao";
    /**
     * Resultado para a solicitação de alteração.
     */
    public static final String SOLICITAR_ALTERACAO = "solicitarAlteracao";
    /**
     * Total de registro da consulta.
     */
    private int totalRegistros;

    /**
     * Salvar mensagem em arquivo de log.
     * @param msg Mensagem de log.
     */
    protected void saveLog(String msg) {
        File file = new File("sepe2010.txt");
        DataOutputStream out = null;
        try {
            out = new DataOutputStream(new FileOutputStream(file));
            out.writeChars(msg);
            out.close();
        } catch (Exception e) {
        }
    }

    /**
     * Retorna a fachada do Sistema.
     * @return A fachada do Sepe.
     */
    public Sepe getSepe() {
        return Sepe.getInstance();
    }

    /**
     * Cria um pager bean com dados para paginação.
     * @return O PagerBean para paginação.
     */
    @SuppressWarnings("unchecked")
    protected PagerBean createPagerBean() {
        Map request = (Map) ActionContext.getContext().get("request");
        Map parametros = (Map) request.get("parameters");
        String[] pagina = (String[]) parametros.get((new ParamEncoder("row").encodeParameterName(TableTagParameters.PARAMETER_PAGE)));

        PagerBean pager = new PagerBean();
        try {
            int page = Integer.parseInt(pagina[0]);
            if (page < 0) {
                pager.setPage(1);
            }
            pager.setPage(page);
        } catch (Exception e) {
            pager.setPage(1);
            // TODO: handle exception
        }
        return pager;
    }

    public void setTotalRegistros(int totalRegistros) {
        this.totalRegistros = totalRegistros;
    }

    public int getTotalRegistros() {
        return totalRegistros;
    }

    @SuppressWarnings("unchecked")
    private Map getSessao() {
        return ActionContext.getContext().getSession();
    }

    public Object getValorSessao(String chave) {
        return getSessao().get(chave);
    }

    public boolean contemValorSessao(String chave) {
        return getSessao().containsKey(chave);
    }

    @SuppressWarnings("unchecked")
    public void putValorSessao(String chave, Object valor) {
        getSessao().put(chave, valor);
    }

    public void removeValorSessao(String chave) {
        getSessao().remove(chave);
    }

    //TODO Tornar esse método abstrado para obrigar as actions a definir a necessidade de login
    public boolean getPrecisaLogar() {
        return false;
    }

    //TODO Tornar esse método abstrado para obrigar as actions a definir a necessidade de login
    public String getPerfil() {
        return "";
    }

    /**
     * @param value
     * @return
     */
    protected boolean isInvalid(String value) {
        return (value == null || value.length() == 0);
    }
}
